本文介绍常用测试工具Sysbench如何对RDS MySQL的X-Engine引擎进行测试,帮助您准确评估X-Engine的性能。
前提条件
- 确认RDS MySQL实例默认存储引擎为X-Engine。 如下所示,XENGINE的Support列值应为DEFAULT。
MySQL [(none)]> show storage engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | XENGINE | DEFAULT | X-Engine storage engine | YES | YES | YES | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | Sequence | YES | Sequence Storage Engine Helper | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 11 rows in set (0.00 sec)
- 确认测试用表存储在X-Engine中。 如下所示,ENGINE=XENGINE。如果建表语句显式注明了ENGINE=INNODB或其他存储引擎,所建的表将不使用X-Engine。
MySQL [sbtest]> show create table sbtest1; +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | sbtest1 | CREATE TABLE `sbtest1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `pad` char(60) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k_1` (`k`) ) ENGINE=XENGINE AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec)
使用DTS进行存储空间测试
我们推荐您使用阿里云数据迁移服务DTS将您的真实数据库数据迁移至X-Engine引擎的RDS MySQL实例,然后查看X-Engine的磁盘空间占用情况,这样的测试结果更符合您的实际业务情况。由于X-Engine同时应用了空间友好的存储格式、前缀编码、分层存储、高效压缩算法等多种技术来降低磁盘空间占用,这些技术的实际效果与您数据库中的库表结构、记录长度等因素相关,所以使用您的真实数据进行测试,结果更为准确。
因为DTS不支持在迁移数据的过程中自动切换存储引擎,您需要在使用X-Engine引擎的RDS MySQL实例上手动创建数据库和表,并按前提条件所述确认建表语句指明使用X-Engine存储引擎(ENGINE=XENGINE),然后使用DTS仅迁移数据,不迁移库表结构。
建议您在完成数据导入后,暂勿执行SQL,并通过RDS控制台持续观测实例的CPU和IOPS利用率情况,待CPU和IOPS基本归零后,此时的空间占用数据较为准确。这是因为X-Engine所采用的LSM-tree数据结构依赖后台异步任务来完成数据压缩等降低存储成本的功能,后台任务的执行需要一些时间,会使用一些CPU和IOPS资源。
详细迁移步骤请参见RDS实例间数据迁移。
使用Sysbench进行存储空间测试
为充分测试X-Engine的空间压缩效率,建议将Sysbench测试命令中的table_size参数设为一个较大的数(在MySQL实例磁盘大小允许范围内)。
与使用DTS测试相同,我们建议您在完成数据导入后持续观测实例的CPU和IOPS利用率情况,待CPU和IOPS基本归零后,此时的空间占用数据较为准确。
Sysbench测试命令:
sysbench /usr/share/sysbench/oltp_update_index.lua \
--mysql-host=[RDS实例连接串] \
--mysql-user=sbtest \
--mysql-password=sbtest@888 \
--mysql-db=sbtest \
--threads=32 \
--tables=32 \
--table_size=1000000000 \
--mysql-storage-engine=XENGINE \
prepare
使用Sysbench进行性能测试
在使用Sysbench进行性能测试时,我们建议您将rand-type设为zipfian,将rand-zipfian-exp设为0.9。
- rand-type为SQL语句填充的随机数的分布。
- zipfian分布是一种常见的带热点倾斜的数据分布,当rand-zipfian-exp为0.9时,使用zipfian分布所生成的随机数更接近真实世界中常见的数据分布,此时测试结果相比使用默认的uniform分布而言更具参考价值。
建议您单次测试进行更长的时间,如3600秒。长时间测试有利于获得更具参考价值的平均性能,降低潜在的干扰因素对性能数据的影响。
建议使用较多的线程数来测试吞吐能力,如512个线程。
如您希望通过对X-Engine进行参数调节来获得更高的性能,请与您的客户经理、售后工程师等阿里云服务人员取得联系,我们将为您提供咨询服务。
Sysbench测试命令:
sysbench /usr/share/sysbench/oltp_point_select.lua \
--mysql-host=[RDS实例连接串] \
--mysql-user=sbtest \
--mysql-password=sbtest@888 \
--time=3600 \
--mysql-db=sbtest \
--tables=32 \
--threads=512 \
--table_size=10000000 \
--rand-type=zipfian \
--rand-zipfian-exp=0.9 \
--report-interval=1 \
run
使用Python脚本批量执行测试
如需要批量进行多个Sysbench测试,推荐使用Python脚本自动执行并记录结果。示例(被测数据库实例连接地址为输入)如下:
import subprocess
import time
import sys
def execute_test(test_name, db_conn_string):
# setup sysbench parameters
mysql = "--mysql-host=%s" % db_conn_string
user = "--mysql-user=sbtest"
password = "--mysql-password=*********"
time = "--time=3600"
database = "--mysql-db=sbtest"
tables = "--tables=32"
threads = "--threads=512"
table_size = "--table_size=1000000"
distribution = "--rand-type=pareto --rand-pareto-h=0.9"
# formulate the sysbench command
cmd = 'sysbench ' + test_name + " " + mysql + " " + user+ " " + password + " " + time+ " " + database+ " " + tables + " " + threads + " " + table_size+ " " + distribution+ " " + "--report-interval=1"+ " " +'run'
# execute
out = subprocess.check_output(cmd,
stderr = subprocess.STDOUT, shell=True)
# output sysbench outputs to a file
output_file_name = "xengine_result_"+test_name[20:len(test_name)]
output_file = open(output_file_name, "w")
output_file.write(out)
output_file.close()
if __name__ == '__main__':
# the connection string for the MySQL (X-Engine) instance to be tested
db_conn_string = sys.argv[1]
test = [
"/usr/share/sysbench/oltp_update_index.lua",
"/usr/share/sysbench/oltp_point_select.lua",
"/usr/share/sysbench/oltp_read_only.lua",
"/usr/share/sysbench/oltp_write_only.lua",
"/usr/share/sysbench/oltp_read_write.lua",
"/usr/share/sysbench/oltp_insert.lua"
]
for atest in test:
print("start test:\t%s\t%s" % (atest, time.ctime()))
execute_test(atest, db_conn_string)
print("end test:\t%s\t%s" % (atest, time.ctime()))
# sleep for some seconds
# after a period of testing with inserts/updates/deletes, x-engine needs some time to complete
# its asynchronous background compactions.
time.sleep(1000)